#include<bits/stdc++.h> 
using namespace std;
//	如果有高速，则从杭州到其他城市就会很方便。但是因为车载量有限，我们需要找到路上的加油
//	站。不同加油站给予的价格不一样，你需要小心决定最近的路。
//1.每一个输入都有一个测试用例。对于每一个测试用例，分为两部分。第一部分包括四个正整数，
//	Cmax≤100表示最大油量，D≤30000表示从杭州到目的地的距离，Davg≤20表示每一单元油可以
//	跑的距离，N≤500表示加油站的总个数。
//2.第二部分紧跟着N行，每一行有一对非负数，Pi和Di，Pi是每单元油的价格，Di是从杭州到加油站
//	的距离。
//3.对于每一个测试用例，输出最便宜那条路的价格，保留两位小数。
//4.假设油箱一开始是空的，如果不可能到达目的地，则输出The maximum travel distance = X，
//	其中X是最大距离，也是2位小数。
//5.贪心算法
//这道题我没做出来，然后看了这个解答觉得讲的挺好的，所以照搬了。 
struct Station{
    double price;//汽油单价
    double dis;//当前加油站与杭州的距离
};

bool cmpByDis(Station a,Station b){
    return a.dis<b.dis;
}

int main(){
    double Cmax,D,Davg;// 油箱容量，全长距离，每单位汽油行驶的距离
    int N; //加油站个数
    scanf("%lf %lf %lf %d",&Cmax,&D,&Davg,&N);
    Station stations[N+1];
    for (int i = 0; i < N; ++i) {
        scanf("%lf %lf",&stations[i].price,&stations[i].dis);
    }
    // 按照距离杭州的距离进行排序
    sort(stations,stations+N,cmpByDis);
    // 把终点也看成是一个加油站
    stations[N].dis = D;
    stations[N].price = 0;
    // 初始化数据
    double total_price = 0;//到达终点的总耗费
    double tank_capacity = 0;//当前的油箱油量
    double max_dis = Cmax*Davg;//汽车可以行驶的最大距离
    // 首先判断在起点是否有加油站
    if(stations[0].dis!=0){
        printf("The maximum travel distance = 0.00");
        return 0;
    }
    // 从现在起，加上油，能跑多远跑多远，且这个远的意思是从现在来看最便宜的加油站的距离 
    for (int j = 0; j < N; ) {
        // 找到在距离当前加油站max_dis内的所有加油站中油价比当前加油站低且最近的加油站，如果没有找到油价最低的加油站
        int min_pos = -1;
        double min_price = 10000000;
        for (int i=j+1;i<N+1&&stations[j].dis+max_dis>=stations[i].dis;++i) {
            if(min_price>stations[i].price){
                // 更新最小油价和位置
                min_pos = i;
                min_price = stations[i].price;
                if(min_price<stations[j].price){
                    // 找到比当前加油站油价更低的加油站i
                    break;
                }
            }
        }
        if (min_pos==-1){
            // 不存在可以到达的加油站
            printf("The maximum travel distance = %.2lf",stations[j].dis+max_dis);
            return 0;
        }
        // 将汽车开到min_pos位置的加油站
        // 首先计算所需要的油量
        double need = (stations[min_pos].dis-stations[j].dis)/Davg;
        if (stations[min_pos].price>stations[j].price){
            //当前的加油站油价更低，加满油再走
            total_price += (Cmax-tank_capacity)*stations[j].price;//更新耗费
            tank_capacity = Cmax;//加油完毕，更新油量
        }else {
            // 当前的加油站油价更高，只加恰好到min_pos的油
            if(tank_capacity<need){
                // 油箱的油不足，需要在当前加油站加油
                total_price += (need-tank_capacity)*stations[j].price;//更新耗费
                tank_capacity = need;//加油完毕，更新油量
            }
        }
        tank_capacity -= need;//行驶完毕，更新油量
        j = min_pos;//到达目的地，更新加油站位置
    }
    printf("%.2lf",total_price);
    return 0;
}